/* Microsoft Reference Implementation for TPM 2.0
 *
 *  The copyright in this software is being made available under the BSD License,
 *  included below. This software may be subject to other third party and
 *  contributor rights, including patent rights, and no such rights are granted
 *  under this license.
 *
 *  Copyright (c) Microsoft Corporation
 *
 *  All rights reserved.
 *
 *  BSD License
 *
 *  Redistribution and use in source and binary forms, with or without modification,
 *  are permitted provided that the following conditions are met:
 *
 *  Redistributions of source code must retain the above copyright notice, this list
 *  of conditions and the following disclaimer.
 *
 *  Redistributions in binary form must reproduce the above copyright notice, this
 *  list of conditions and the following disclaimer in the documentation and/or
 *  other materials provided with the distribution.
 *
 *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ""AS IS""
 *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 *  DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 *  ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 *  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 *  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 *  ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
#include "Tpm.h"
#include "PCR_SetAuthValue_fp.h"

#if CC_PCR_SetAuthValue  // Conditional expansion of this file

/*(See part 3 specification)
// Set authValue to a group of PCR
*/
//  Return Type: TPM_RC
//      TPM_RC_VALUE                PCR referenced by 'pcrHandle' is not a member
//                                  of a PCR authorization group
/*
This command changes the authValue of a PCR or group of PCR.
An authValue may only be associated with a PCR that has been defined by a platform-specific specification 
as allowing an authorization value. If the TPM implementation does not allow an authorization for pcrNum, 
the TPM shall return TPM_RC_VALUE. A platform-specific specification may group PCR so that they share a common 
authorization value. In such case, a pcrNum that selects any of the PCR in the group will change the authValue 
value for all PCR in the group.
The authorization setting is set to EmptyAuth on each STARTUP(CLEAR) or by TPM2_Clear(). The authorization 
setting is preserved by SHUTDOWN(STATE)
此命令更改 PCR 或 PCR 组的 authValue。
authValue 只能与平台特定规范定义为允许授权值的 PCR 相关联。 如果 TPM 实现不允许 pcrNum 授权，则 TPM 应返回 TPM_RC_VALUE。 
特定于平台的规范可以对 PCR 进行分组，以便它们共享共同的授权值。 在这种情况下，选择组中任何 PCR 的 pcrNum 将更改组中所有 PCR 的 
authValue 值。
授权设置在每次 STARTUP(CLEAR) 时或通过 TPM2_Clear() 设置为 EmptyAuth。 授权设置由 SHUTDOWN(STATE) 保留

*/
TPM_RC
TPM2_PCR_SetAuthValue(
    PCR_SetAuthValue_In     *in             // IN: input parameter list
    )
{
    UINT32      groupIndex;
// Input Validation:

    // If PCR does not belong to an auth group, return TPM_RC_VALUE
    if(!PCRBelongsAuthGroup(in->pcrHandle, &groupIndex))
        return TPM_RC_VALUE;

    // The command may cause the orderlyState to be cleared due to the update of
    // state clear data.  If this is the case, Check if NV is available.
    // A TPM_RC_NV_UNAVAILABLE or TPM_RC_NV_RATE error may be returned at
    // this point
    RETURN_IF_ORDERLY;

// Internal Data Update

    // Set PCR authValue
    MemoryRemoveTrailingZeros(&in->auth);
    gc.pcrAuthValues.auth[groupIndex] = in->auth;

    return TPM_RC_SUCCESS;
}

#endif // CC_PCR_SetAuthValue